Skip to content

自定义函数

c++中函数定义一般是下面的方式:

c
函数返回类型  函数名( 形式参数表列 )
{
    函数体语句;
}

下面列出一个函数的所有组成部分:

注意

函数名称: 这是函数的实际名称。函数名和参数列表一起构成了函数签名。

函数主体: 函数主体包含一组定义函数执行任务的语句。

返回类型: 一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。

参数: 参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。

函数示例

该函数有两个参数 x 和 y,会返回这两个数的和:

cpp
#include<iostream>
using namespace std;
int func(int x, int y)  //定义函数,传入参数x, y
{
    return x+y;  //返回x+y;
}
int main()
{
    int sum = func(50, 660);
    cout << sum << endl;
    return 0;
}

运行结果:

c
710

分析

50 传给了 x,660 传给了 y,最终在函数里计算得到 710 返回到主函数给 sum 进行接收

函数名称: func

函数主体: return x + y;

返回类型: int 类型

参数: 参数 x 和 参数 y

函数声明

函数声明会告诉编译器函数名称及如何调用函数。

函数声明包括以下几个部分:

c
函数返回类型  函数名( 形式参数表列 )  ;

针对上面定义的函数 func(),以下是函数声明:

c
int func(int x, int y) ;

在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明:

c
int func(int , int ) ;

函数调用

创建 C++自定义函数后,就可以通过调用之来执行它。当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。

调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。

例如上面的程序,我们把函数里面 x+y 跟 主函数传过来的 sum 都打印一下看看:

cpp
#include<iostream>
using namespace std;
int func(int x, int y)  //定义函数,传入参数x, y
{
    cout << "func函数内 x+y 的值是:"  << x + y << endl;
    return x+y;  //返回x+y;
}
int main()
{
    int sum = func(50, 660);
	cout << "主函数内 sum 的值是:"  << sum << endl;
    return 0;
}

运行结果:

c
func函数内 x+y 的值是:710
主函数内 sum 的值是:710

分析

x+y 跟 sum 的结果是一致的
第 10 行代码中 的 func(50, 660); 即函数调用 :::

函数参数

函数参数分为 形式参数 和 实际参数

形式参数

如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。

形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。

当调用函数时,有三种向函数传递参数的方式:

调用类型描述
传值调用该方法把参数的实际值赋值给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响。
指针调用该方法把参数的地址赋值给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
引用调用该方法把参数的引用赋值给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数

实际参数

即实际传给函数进行计算的数值,例如上面的程序,在主函数中传入的 50 和 660 就是实际参数

c
    int sum = func(50, 660);
	cout << "主函数内 sum 的值是:"  << sum << endl;

传值调用

  • 将参数以值的形式传入函数,函数内的操作,不改变原参数。
引用变量作为函数参数 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
void fun(int a){
	a = 1;
}
int main()
{
    int a = 10;
	fun(a);
	cout << "a的值是:" << a << endl; //a的值还是10,没有被改变
    return 0;
}

引用调用

  • 将参数以引用的形式传入函数,函数内的操作,会改变原参数。
引用变量作为函数参数 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
void fun(int& a){
	a = 1;
}
int main()
{
    int a = 10;
	fun(a);
	cout << "a的值是:" << a << endl; //a的值是1,被改变了
    return 0;
}
数组变量作为函数参数 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
void fun(int a[]){
	a[0] = 1;
}
int main()
{
    int a[3] = {3,2,1};
	fun(a);
	cout << "a[0]的值是:" << a[0] << endl;
    //a的值是1,被改变了。因为数组传入的就是引用地址。
    return 0;
}

局部变量和全局变量

任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。
有以下三个地方可以声明变量:

  • 在函数或块内部的局部变量
  • 在所有函数外部的全局变量
  • 在形式参数的函数参数定义中

我们先来认识一下局部变量全局变量

局部变量

在某个函数或块的内部声明的变量称为局部变量。它们只能被该函数或该代码块内部的语句使用。局部变量在函数外部是不可知的。下面是使用局部变量的实例。

  • 以函数为例:
局部变量 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a = 10;
	int b = 20;
	int c = 30;
    cout << "在main函数内:" << endl;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
    return 0;
}

运行结果:

c
在main函数内:
a = 10
b = 20
c = 30

分析

这里的 a,b,c 都是 main 函数的局部变量

  • 以代码块为例:
局部变量 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
    for(int i=1;i<=1;i++){
		int a = 100;
		int b = 200;
		int c = 300;
		cout << "在for循环内:" << endl;
		cout << "a = " << a << endl;
		cout << "b = " << b << endl;
		cout << "c = " << c << endl;
	}
    return 0;
}

运行结果:

c
在for循环内:
a = 100
b = 200
c = 300

分析

这里的 a,b,c 都是 for 循环的局部变量,出了 for 循环,这里的 a,b,c 即消亡了,若在 for 循环外面进行打印 a,b,c 的值,程序会报错;

cpp
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
	for(int i=1;i<=1;i++){
		int a = 100;
		int b = 200;
		int c = 300;
		cout << "在for循环内:" << endl;
		cout << "a = " << a << endl;
		cout << "b = " << b << endl;
		cout << "c = " << c << endl;
	}
	cout << "在main函数内:" << endl;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
	return 0;
}

警告

程序报错,此时 16 行,17 行,18 行的 a,b,c 未定义;再次验证了局部变量的作用;

全局变量

全局变量是定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。

全局变量可以被任何函数访问。也就是说,全局变量在声明后整个程序中都是可用的。

全局变量 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int sum;
int main()
{
    int a = 10;
	int b = 20;
	sum = a + b;
	cout << "sum = " << sum << endl;
    return 0;
}

运行结果:

c
sum = 30

分析

这里的 sum 是全局变量,a,b 是 main 函数内部的局部变量,验证了全局变量在声明后整个程序中都是可用的;

局部变量 和 局部变量重名怎么处理?

在程序中,局部变量和全局变量的名称可以相同,但是在函数内,如果两个名字相同,会优先使用局部变量值,全局变量不会被使用。

我们来看一个例子:

全局变量 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int sum = 1;
void func(int x,int y)
{
	int sum = 0;
	sum = x + y;
	cout << "func函数内:sum = " << sum << endl;
}
int main()
{
    func(10,20);
	cout << "main函数内: " << endl;
	cout << "sum = " << sum << endl;
    return 0;
}

运行结果:

c
func函数内:sum = 30
main函数内:
sum = 1

分析

可以看的出来,程序执行之后,全局变量 sum 的值是 1,局部变量 sum 的值是 30;
在 func 函数内部,打印的 sum 值是函数内部定义的 sum,而不是全局变量 sum;